#include <stdio.h>
#include <poll.h>
#include <stropts.h>
#include "Socket-Server.h"
#include "Socket-Client.h"
#include "serializable.h"
#include "FuncionesPPD.h"
#include "Prueba-ArchConfig.h"

void SocketClient(int32_t socket)
{
	while(RecivMensaje(socket) != 0);
	close(socket);
}

void *Tmodoinicio(void *parametro) {

	datosConfigPPD * config = (datosConfigPPD *) parametro;

	if (strcmp((char *) config->modoIncio, "CONNECT") == 0) {
		int32_t socketEntrada = CreaConexionclient_INET(
				(char *) config->direccionIP, (char *) config->puerto);

		int32_t okhs = handshakePPD_RAID(socketEntrada,
				(char *) config->identificadorDisco);

		if (okhs == 0) {
			printf("error HandShake");
			close(socketEntrada);
			return NULL;
		}
		while (1) {
			//RecivMensaje(socketEntrada);
			RecivMensajeOK(socketEntrada);
		}

		printf("paso por connect \n");
		close(socketEntrada);
	}

	else if (strcmp((char *) config->modoIncio, "LISTEN") == 0) {

		int32_t socketEntrada = CreaConexionServer_INET(
				(char *) config->puerto);
		struct sockaddr_in direccionRem;
		socklen_t direccionRemSize;
		int32_t sock1;
		fd_set fds;
		int32_t maxfd, i;

		FD_ZERO(&fds);
		FD_SET(socketEntrada, &fds);
		maxfd = socketEntrada;
		list_sockets aSocketList;
		pthread_t thread_socketclient;
		aSocketList.list = NULL;

		while (1) {
			if (select(maxfd + 1, &fds, NULL, NULL, NULL) != -1) {
				for (i = 0; i <= maxfd; i++) {
					if (FD_ISSET(i, &fds)) { //Ocurrio un evento en el fd i
						if (list_sockets_exists(&aSocketList, i) != -1) { //Es un socket activo
							if (RecivMensaje(i) == 0) { //Hay que cerrar este socket desp del send
								//si es 0 se cerro la conexion => cierro el fd
								FD_CLR(i, &fds);
								close(i);
							}
						}
						else
						if (i == socketEntrada) {
							sock1 = accept(socketEntrada, (struct sockaddr*) &direccionRem, &direccionRemSize);
							pthread_create(&thread_socketclient, NULL, (void *) SocketClient, (void *) sock1);
							continue;
							list_sockets_add(&aSocketList, sock1);
							FD_SET(sock1, &fds); //mete el descriptor sock1 al puntero fds
							if(sock1 > maxfd)
								maxfd = sock1;
						}
					}
				}

			}
		}

		close(socketEntrada);
	}
	return NULL;
}

/*
 struct sockaddr_in direccionRem;
 socklen_t direccionRemSize;
 struct pollfd fds[20];
 int32_t idPoll;
 int32_t n=0;
 int32_t i;
 int32_t socketEntrada = CreaConexionServer_INET ((char *)config->puerto);
 direccionRemSize = sizeof(direccionRem);
 fds[0].fd= socketEntrada;
 fds[0].events= POLLIN | POLLHUP ;

 int32_t HandshakeOK = 0; //Variable 1/0 que controla si el handshake se hizo bien

 while(1) {

 idPoll = poll(fds,20, 0);

 if (idPoll > 0){
 if((fds[0].revents & POLLIN) && (!HandshakeOK)) {
 fds[1].fd = accept(socketEntrada,(struct sockaddr*) &direccionRem, &direccionRemSize);
 int32_t okhs= handshakePPD_FS(fds[1].fd);
 if(okhs != 1){
 printf("error HandShake");
 }
 else {
 HandshakeOK = 1;
 }
 for(i=1;i<20;i++) {
 fds[i].events= POLLIN | POLLHUP;
 }
 }
 else if(fds[0].revents & POLLIN ){
 socketEntrada = accept(fds[0].fd,(struct sockaddr*) &direccionRem, &direccionRemSize);
 RecivMensaje(socketEntrada);
 }
 }
 }//end while(1)

 printf("paso por listen \n");
 }
 else{
 printf("ERROR MODO INICIO \n");
 }

 //pthread_exit(NULL);
 return NULL;
 }
 */
